/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package agh.rozproszony.messages;

import agh.rozproszony.DBStorage.DataBaseEngine;
import agh.rozproszony.model.Message;
import java.io.*;
import java.rmi.RemoteException;
import java.rmi.server.UnicastRemoteObject;
import java.sql.SQLException;
import java.util.*;
import java.util.logging.Level;
import java.util.logging.Logger;

/**
 *
 * @author Seweryn
 */
public class MessagesRMIServer extends UnicastRemoteObject implements MessagesServer {

    protected DataBaseEngine DataBase;
    protected Map<Integer, Integer> Wektory;
    protected File LogWek;
    protected BufferedWriter o;


public MessagesRMIServer(DataBaseEngine pmDataBase) throws RemoteException
    {

        DataBase = pmDataBase;
        Wektory = new HashMap<Integer, Integer>();
        LogWek = LogWek = new File("wektorSerwer1.txt");
        FileWriter file = null;
        try {
            file = new FileWriter(LogWek, true);
        } catch (IOException ex) {
            Logger.getLogger(MessagesRMIServer.class.getName()).log(Level.SEVERE, null, ex);
        }
        o = new BufferedWriter(file);
    }
    @Override
    protected void finalize() throws Throwable
    {
        o.close();
        super.finalize();
        
        
    }
     /**

    /**
     * Funkcja służąca do pobierania wiadomości po jego ID.
     *
     * @param messageId - Identyfikator wiadomości
     * @return Wiadomość
     * @throws RemoteException
     */
    @Override
    public Message getMessage(int messageId) throws RemoteException {
        Message lvMes = null;

        try {
            lvMes = DataBase.getMessage(messageId);
        } catch (SQLException ex) {
            System.out.println("ERROR:MessagesRmiSerwer->getMessage: " + ex.toString());
        }
        return lvMes;
    }

    /**
     * Funkcja zwracająca listę nieprzczytanych wiadomości dla danego
     * użytkownika.
     *
     * @param userId - identyfikator zarejestrowanego użytkownika.
     * @return Lista wiadomości nieprzeczytanych.
     * @throws RemoteException
     */
    @Override
    public ArrayList<Message> getNotReadedMessages(int userId) throws RemoteException {
        ArrayList<Message> lvMesLis = null;
        try {
            lvMesLis = DataBase.getNotReadedMessages(userId);
        } catch (SQLException ex) {
            System.out.println("ERROR:MessagesRmiSerwer->getNotReadedMessages(): " + ex.toString());
        }
        return lvMesLis;
    }

    /**
     * Funkcja pobierająca listę wszystkich wiadomości dla użytkownika.
     *
     * @param userId - identyfikator zarejestrowanego użytkownika.
     * @return
     * @throws RemoteException
     */
    @Override
    public ArrayList<Message> getMessages(int userId) throws RemoteException {
        ArrayList<Message> lvMesLis = null;
        try {
            lvMesLis = DataBase.getMessages(userId);
        } catch (SQLException ex) {
            System.out.println("ERROR:MessagesRmiSerwer->getMessages(): " + ex.toString());
        }
        return lvMesLis;

    }

    /**
     * Funkcja umieszczająca wiadomość na serwerze.
     *
     * @param message - wysłana wiadomość
     * @throws RemoteException
     */
    @Override
    public Boolean insertMessage(Message message) throws RemoteException {

        try {
            DataBase.insertMessage(message);
        } catch (SQLException ex) {
            System.out.println("ERROR:MessagesRmiSerwer->insertMessage(): " + ex.toString());
            return false;
        }

        return true;
    }

    @Override
    public Map<Integer, Integer> getWektor() throws RemoteException {
        List<Integer> lvWek = new ArrayList<Integer>();
            return Wektory;
    }

    @Override
    public Boolean addWektor(int userId) throws RemoteException {
        if (Wektory.get(userId) == null) {
            Wektory.put(userId, 0);
        } else {
            Wektory.put(userId, Wektory.get(userId) + 1);
        
        LogujWektor();
         return true;
         }
         return null;
     }
     
     private void LogujWektor()
     {
        try {

            Set<Integer> a = Wektory.keySet();
            Date czas = new Date();
            o.write(czas.toGMTString()+" :stan wektora Serwer:");
            o.newLine();
            for(Integer m:a)
            {
                
              o.write("User: "+m+" wartosc: "+Integer.toString(Wektory.get(m))+"\n");  
              o.newLine();
            }
            o.flush();
            
        } catch (IOException ex) {
            System.out.println("ERROR:MessagesController->LogujWektor(): " + ex.toString());
        }
    }
}
